/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.rcs.folders;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Esta carpeta permite crear una carpeta compuesta por otras, que están en el mismo orden en el que se añaden. Las carpetas que se se añaden no deben de tener
 * el mimo nombre, si lo tienen se lanzará un IllegalArgumentException.
 *
 * @author pablo
 */
public class CompositeFolder extends AbstractFolder {

  private String name;
  private List<VirtualItem> items;

  /**
   * Crea una carpeta compuesta por todos lo items dados. Los items no deben de tener el mismo nombre
   *
   * @param name
   * @param items
   */
  public CompositeFolder(String name, VirtualItem... items) {
    this.name = name;
    this.items = new ArrayList<VirtualItem>(items.length);

    for (int i = 0; i < items.length; ++i)
      if (!hasItem(items[i]))
        this.items.add(items[i]);
      else
        throw new IllegalArgumentException(String.format("Duplicate item %s", items[i]));
  }

  @Override
  public String getName() {
    return name;
  }

  public void addItem(VirtualItem item) {
    if (hasItem(name))
      throw new IllegalArgumentException(String.format("Duplicate item %s", name));

    items.add(item);
  }

  public void addItem(VirtualItem item, String name) {
    if (item instanceof VirtualFolder)
      addItem(new WrapperFolder((VirtualFolder) item, name));
    else
      addItem(new WrapperItem(item, name));
  }

  @Override
  public List<? extends VirtualItem> getChildren() {
    return Collections.unmodifiableList(items);
  }

  public boolean hasItem(String displayName) {
    return hasItem(displayName, items) ;
  }

  public boolean hasItem(VirtualItem item) {
    return hasItem(item, items);
  }
}
